package br.com.sgmf.web.managedbean;

import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import br.com.sgmf.enums.Estado;
import br.com.sgmf.model.Endereco;
import br.com.sgmf.model.Funcao;
import br.com.sgmf.model.Funcionario;
import br.com.sgmf.model.Setor;
import br.com.sgmf.service.FuncaoService;
import br.com.sgmf.service.FuncionarioService;
import br.com.sgmf.service.SetorService;

@Component
@ManagedBean
@RequestScoped
public class FuncionarioBean {

	private static final String FUNCIONARIO_SALVO_COM_SUCESSO = "Funcionário salvo com sucesso!";
	private static final String FUNCIONARIO_EXCLUIDO_COM_SUCESSO = "Funcionário excluído com sucesso!";
	private static final String ERRO_AO_SALVAR_FUNCIONARIO = "Erro ao salvar Funcionário";
	private static final String ERRO_AO_EXCLUIR_FUNCIONARIO = "Erro ao excluir Funcionário";

	private Funcionario funcionario;
	private Endereco endereco;

	private List<Funcionario> funcionarios;
	private List<Setor> setores;
	private List<Funcao> funcoes;

	@Autowired
	private FuncionarioService funcionarioService;

	@Autowired
	private FuncaoService funcaoService;

	@Autowired
	private SetorService setorService;

	@PostConstruct
	public void inicializar() {
		funcionario = new Funcionario();
		endereco = new Endereco();
		funcionarios = funcionarioService.findAll();
	}

	public String salvar() {
		FacesContext context = FacesContext.getCurrentInstance();
		FacesMessage message;

		try {
			funcionarioService.saveOrUpdate(funcionario, endereco);
			message = new FacesMessage(FacesMessage.SEVERITY_INFO,
					FUNCIONARIO_SALVO_COM_SUCESSO, null);
			inicializar();
		} catch (Exception e) {
			message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
					ERRO_AO_SALVAR_FUNCIONARIO, null);
			e.printStackTrace();
		}

		context.addMessage(null, message);
		return null;
	}

	public void novo() {
		funcionario = new Funcionario();
		endereco = new Endereco();
	}

	public String editar(Funcionario funcionario) {
		this.funcionario = funcionario;
		this.endereco = funcionario.getEndereco();
		return null;
	}

	public String excluir(Funcionario funcionario) {
		FacesContext context = FacesContext.getCurrentInstance();
		FacesMessage message;

		try {
			funcionarioService.delete(funcionario);
			message = new FacesMessage(FacesMessage.SEVERITY_INFO,
					FUNCIONARIO_EXCLUIDO_COM_SUCESSO, null);
			inicializar();
		} catch (Exception e) {
			message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
					ERRO_AO_EXCLUIR_FUNCIONARIO, null);
			e.printStackTrace();
		}

		context.addMessage(null, message);
		return null;
	}

	public Estado[] getEstados() {
		return Estado.values();
	}

	public Funcionario getFuncionario() {
		return funcionario;
	}

	public void setFuncionario(Funcionario funcionario) {
		this.funcionario = funcionario;
	}

	public Endereco getEndereco() {
		return endereco;
	}

	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}

	public List<Funcionario> getFuncionarios() {
		return funcionarios;
	}

	public void setFuncionarios(List<Funcionario> funcionarios) {
		this.funcionarios = funcionarios;
	}

	public List<Setor> getSetores() {
		return setores;
	}

	public void setSetores(List<Setor> setores) {
		this.setores = setores;
	}

	public List<Funcao> getFuncoes() {
		return funcoes;
	}

	public void setFuncoes(List<Funcao> funcoes) {
		this.funcoes = funcoes;
	}

	public FuncionarioService getFuncionarioService() {
		return funcionarioService;
	}

	public void setFuncionarioService(FuncionarioService funcionarioService) {
		this.funcionarioService = funcionarioService;
	}

	public FuncaoService getFuncaoService() {
		return funcaoService;
	}

	public void setFuncaoService(FuncaoService funcaoService) {
		this.funcaoService = funcaoService;
	}

	public SetorService getSetorService() {
		return setorService;
	}

	public void setSetorService(SetorService setorService) {
		this.setorService = setorService;
	}

}
